package com.topfinance.ui;

import com.topfinance.frame.exception.AppException;

import com.topfinance.payment.dto.TC2BisClasMsgDto;
import com.topfinance.payment.ebo.*;
import com.topfinance.payment.service.*;
import com.topfinance.payment.service.impl.*;

import java.util.*;

public class UIBizHelper extends UIHelper{
	private static UIBizHelper instance;
	private UIBizHelper() {
		init();
	}
	
	public static UIBizHelper getInstance() {
		if (instance == null) {
			instance = new UIBizHelper();
		}
		return instance;
	}

	/**
	 * 返回业务属性列表
	 * 
	 * @return
	 */
	public List<TC2BisCatgEbo> getBizCatg() throws AppException {
		ITC2BisCatgMgr catgImp = (TC2BisCatgMgrImpl) f3.getBean("c2BisCatgMgr");
		List<TC2BisCatgEbo> catgs = catgImp.getAllBisCatg();
		return catgs;
	}

	/**
	 * 根据应用模块名称获得消息列表，APP=HVPS,BEPS,SAPS,CCMS等
	 * 
	 * @return
	 */
	public List<TC2MsgListEbo> getBizMsg(String app) throws AppException {
		ITC2MsgListMgr msgImp = (TC2MsgListMgrImpl) f3.getBean("c2MsgListMgr");
		List<TC2MsgListEbo> msgs = msgImp.getAllMsgs("CNAPS2", app);
		return msgs;
	}
	
	//获得TC2MsgListEbo对象
	//根据msgcode,如果msgcode对应的对象不唯一，异常
	public TC2MsgListEbo getMsgListEbo(String msgcode) throws AppException{
		ITC2MsgListMgr msgImp = (TC2MsgListMgrImpl) f3.getBean("c2MsgListMgr");
		return msgImp.getMsgListEbo(msgcode);		
	}

	/**
	 * 根据消息编码获得所对应的业务类型，msg=hvps.111.001.01等
	 * 
	 * @return
	 */
	public List<TC2BisTpMsgEbo> getBizTypeByMsg(String msg) throws AppException {
		ITC2BisTpMsgMgr biztpImp = (TC2BisTpMsgMgrImpl) f3.getBean("c2BisTpMsgMgr");
		List<TC2BisTpMsgEbo> biztps = biztpImp.getAllBisTpMsg(msg);
		return biztps;
	}

	//返回TC2BisTpMsgEbo
	//参数：msgcode=消息编号，tpcode=业务类型
	public TC2BisTpMsgEbo getBisTpMsgEbo(String msgcode,String tpcode) throws AppException{
		ITC2BisTpMsgMgr biztpImp = (TC2BisTpMsgMgrImpl) f3.getBean("c2BisTpMsgMgr");
		return biztpImp.getBisTpMsgEbo(msgcode, tpcode);		
	}
	
	//获得业务类型报文对应,此方法只有在tpcode不对应clascode情况调用
	//参数：tpCode=类型，appType=应用模块
	public TC2BisTpMsgEbo getBisTpMsgEboWithNoMsg(String tpCode,String appType) throws AppException{
		ITC2BisTpMsgMgr biztpImp = (TC2BisTpMsgMgrImpl) f3.getBean("c2BisTpMsgMgr");
		return biztpImp.getBisTpMsgEboWithNoMsg(tpCode, appType);		
	}

	/**
	 * 根据业务属性编码获得所对应的业务类型，catgCode=A/B/C等
	 * 
	 * @return
	 */
	public List<TC2BisTypeEbo> getBizTypeByCatg(String catgCode) throws AppException {
		ITC2BisTypeMgr typeImp = (TC2BisTypeMgrImpl) f3.getBean("c2BisTypeMgr");
		List<TC2BisTypeEbo> types = typeImp.getAllBisType(catgCode);
		return types;
	}

	/**
	 * 根据消息编码,业务类型获得所对应的业务种类，msg=hvps.111.001.01，tp=A100等
	 * 
	 * @return
	 */
	public List<TC2BisClasEbo> getBizClas(String msg,String tp,String app) throws AppException {
		ITC2BisClasMgr clasImp = (TC2BisClasMgrImpl) f3.getBean("c2BisClasMgr");
		List<TC2BisClasEbo> clas = clasImp.getAllBisClas(null, tp, app);
		return clas;
	}

	/**
	 * 根据业务类型和应用模块获得所对应的业务种类，tp=A100，app=HVPS等
	 * 
	 * @return
	 */
	public List<TC2BisClasMsgDto> getBizClasMsg(String tpCode,String app) throws AppException {
		ITC2BisClasMgr clasImp = (TC2BisClasMgrImpl) f3.getBean("c2BisClasMgr");
		List<TC2BisClasMsgDto> clas = clasImp.getAllBisClasMsg(null,tpCode,app);
		return clas;
	}

	//获得业务种类对象
	//参数：tpcode=业务类型，clascode=业务种类，apptype=应用
	public TC2BisClasEbo getBisClasEbo(String tpcode,String clascode,String apptype) throws AppException{
		ITC2BisClasMgr clasImp = (TC2BisClasMgrImpl) f3.getBean("c2BisClasMgr");
		return clasImp.getBisClasEbo(tpcode,clascode,apptype);		
	}
	
	/**
	 * 业务属性
	 * 
	 * @return
	 */
	public List<TC2BisCatgEbo> getBisCat() throws AppException {
		ITC2BisCatgMgr catgImp = (TC2BisCatgMgrImpl) f3.getBean("c2BisCatgMgr");
		// 业务属性
		List<TC2BisCatgEbo> catgs = catgImp.getAllBisCatg();
		return catgs;
	}

	/**
	 * 业务类型
	 * 
	 * @param catCode
	 *            等于TC2BisCatgEbo.getCatCode()
	 * @return
	 */
	public List<TC2BisTypeEbo> getBisType(String catCode) throws AppException {
		ITC2BisTypeMgr typeImp = (TC2BisTypeMgrImpl) f3.getBean("c2BisTypeMgr");
		// 业务类型
		List<TC2BisTypeEbo> types = typeImp.getAllBisType(catCode);
		return types;
	}

	/**
	 * 业务种类
	 * 
	 * @param catCode
	 *            等于TC2BisCatgEbo.getCatCode()
	 * @param tpCode
	 *            等于TC2BisTypeEbo.getTpCode()
	 * @return
	 * @throws AppException
	 */
	public List<TC2BisClasEbo> getBisClass(String catCode, String tpCode) throws AppException {
		ITC2BisClasMgr clasImp = (TC2BisClasMgrImpl) f3.getBean("c2BisClasMgr");
		// 业务种类
		List<TC2BisClasEbo> clas = clasImp.getAllBisClas(catCode, tpCode, null);
		return clas;
	}

	/**
	 * 
	 * @param appType
	 *            TC2BisClasEbo.getAppType()
	 * @param clsCode
	 *            TC2BisClasEbo.getClsCode()
	 * @param tpCode
	 *            TC2BisTypeEbo.getTpCode()
	 * @return
	 * @throws AppException
	 */
	public List<TC2BisTpMsgEbo> getBisMsg(String appType, String clsCode, String tpCode) throws AppException {
		ITC2BisTpMsgMgr bistpImp = (TC2BisTpMsgMgrImpl) f3.getBean("c2BisTpMsgMgr");
		// 获得业务
		List<TC2BisTpMsgEbo> bistps = bistpImp.getAllBisTpMsg(tpCode, clsCode, appType);
		return bistps;
	}

	/**
	 * 
	 * @param msgCode
	 * @return 业务类型列表
	 * @throws AppException
	 */
	public List<TC2BisTpMsgEbo> getBisMsgEbo(String msgCode) throws AppException {
		ITC2BisTpMsgMgr bistpImp = (TC2BisTpMsgMgrImpl) f3.getBean("c2BisTpMsgMgr");
		List<TC2BisTpMsgEbo> bistps = bistpImp.getAllBisTpMsg(msgCode);
		return bistps;
	}
		
	/**
	 * 获取业务要素中的各字段定义
	 * 
	 * @param mesgCode
	 *            报文号
	 * @param tpCode
	 *            类型编码
	 * @param clsCode
	 *            种类编码
	 * @param appType
	 * @return 一个列表，列表中每个对象对应一个业务要素字段的宏信息。。
	 */
	public List<TC2BisEleBscEbo> getBizFields(String mesgCode, String tpCode, String clsCode, String appType)
			throws AppException {
		ITC2BisEleBscMgr eleImp = (TC2BisEleBscMgrImpl) f3.getBean("c2BisEleBscMgr");
		List<TC2BisEleBscEbo> eles = eleImp.getAllBisEle(mesgCode,tpCode, clsCode,appType);
		return eles;
	}
	
	/**
	 * 获取业务要素中的各字段定义
	 * 
	 * @param mesgCode
	 *            报文号
	 * @param tpCode
	 *            类型编码
	 * @param clsCode
	 *            种类编码
	 * @return 一个列表，列表中每个对象对应一个业务要素字段的宏信息。。
	 */
	public List<TC2BisEleBscEbo> getBizFields(String mesgCode, String tpCode, String clsCode) throws AppException {
		ITC2BisEleBscMgr eleImp = (TC2BisEleBscMgrImpl) f3.getBean("c2BisEleBscMgr");
		List<TC2BisEleBscEbo> eles = eleImp.getAllBisEle(mesgCode,tpCode, clsCode);
		return eles;
	}
	

	/**
	 * 获取行内系统8583格式中的各字段定义
	 * 
	 * @param formatId
	 *            UI上选中的行内系统格式（记录主键）
	 * @return 一个列表，列表中每个对象对应一个行内格式字段的宏信息（或一个格式明细表的记录）。
	 */
	public List<TCfgFmt8583Ebo> get8583Fields(Integer fmtOid) throws AppException {
		ITCfgFormatMgr fmtImp = (TCfgFormatMgrImpl) f3.getBean("cfgFormatMgr");
		List<TCfgFmt8583Ebo> f8583s = fmtImp.getAllFmt8583(fmtOid,null);
		return f8583s;
	}

	/**
	 * 获取行内系统8583格式中的各字段定义
	 * 
	 * @param formatId
	 *            UI上选中的行内系统格式（记录主键）
	 * @return 一个列表，列表中每个对象对应一个行内格式字段的宏信息（或一个格式明细表的记录）。
	 * 			通过调用TCfgFmtXmlEbo.getXsdFile()获得XSD定义
	 */
	public TCfgFmtXmlEbo getXMLFields(Integer fmtOid) throws AppException {
		ITCfgFormatMgr fmtImp = (TCfgFormatMgrImpl) f3.getBean("cfgFormatMgr");
		List<TCfgFmtXmlEbo> xmls = fmtImp.getAllFmtXML(fmtOid,null);
		if(xmls.size() == 1)
			return xmls.get(0);
		return null;
	}
	
	/**
	 * 获取可选的行内系统格式
	 * 
	 * @return 一个列表。每个Format元素是一个可选的行内系统格式。每个格式对应多个格式明细表的记录
	 */
	public List<TCfgFormatEbo> getFormats() throws AppException {
		ITCfgFormatMgr fmtImp = (TCfgFormatMgrImpl) f3.getBean("cfgFormatMgr");
		List<TCfgFormatEbo> fmts = fmtImp.getAllFormat();
		// debug
//		debug("size of formats: " + fmts.size());
//		for (TCfgFormatEbo f : fmts) {
//			debug("[fmtId,fmtName]" + f.getOid() + "," + f.getName());
//		}
		return fmts;
	}

	/**
	 * 获取已保存的映射关系
	 * 
	 * @param mesgCode
	 *            报文号
	 * @param tpCode
	 *            类型编码
	 * @param clsCode
	 *            种类编码
	 * @return 一个Rule对象，代表建立好的映射关系（详见Rule对象定义），返回空值则该映射关系尚不存在
	 */
	public TCfgMapRuleEbo getRule(String mesgCode, String tpCode, String clsCode) throws AppException {
//		ITCfgMapRuleMgr mgr = (TCfgMapRuleMgrImpl) f3.getBean("cfgMapRuleMgr");
//		TCfgMapRuleEbo ebo = mgr.getMapRule(mesgCode, tpCode, clsCode);
//		return ebo;
		return null;
	}

	/**
	 * 保存映射关系 （如果已存在，则自动覆盖原有的）
	 * 
	 * @param rule
	 *            一个映射关系定义
	 * @return
	 */
	public boolean saveMapRule(TCfgFmtEleMapFileEbo rule, List<Integer> detailsToDelete) throws AppException {
		ITCfgFmtEleMapMgr mgr = (TCfgFmtEleMapMgrImpl) f3.getBean("cfgEleMapMgr");
		mgr.saveMapRule(rule, detailsToDelete);
		return true;
	}

	/**
	 * 获得映射关系 
	 * 
	 * @param rule
	 *            一个映射关系定义
	 * @return
	 */
	public TCfgFmtEleMapFileEbo getMapRule(Integer mapID,String msgCode, String tpCode, String clsCode) throws AppException {
		ITCfgFmtEleMapMgr mgr = (TCfgFmtEleMapMgrImpl) f3.getBean("cfgEleMapMgr");
		return mgr.getMapRule(mapID,msgCode,tpCode, clsCode);
	}
	
	public TCfgFmtEleMapRuleEbo buildDetail(TCfgFmt8583Ebo fmt8583, TC2BisEleBscEbo bisEle) {
		TCfgFmtEleMapRuleEbo res = new TCfgFmtEleMapRuleEbo();
		res.setPteFldId(fmt8583.getId());
		res.setPteFldPath(fmt8583.getPosition());
		res.setPteFldType(fmt8583.getFldType());
		res.setBizFldEleId(bisEle.getEleId());
		// TODO
		res.setBizFldMode("");
		res.setBizFldName(bisEle.getEleName());
		res.setBizFldPath(bisEle.getPath());
		res.setBizFldType(bisEle.getType());
		res.setBizFldValue(bisEle.getDefValue());
		return res;
	}

	public static void main(String[] args) {
		try {
			UIBizHelper helper = UIBizHelper.getInstance();

//			List<TC2BisCatgEbo> cats = helper.getBisCat();
//			for (TC2BisCatgEbo cat : cats) {
//				System.out.println(cat.getName());
//			}
			
//			List<TCfgFmt8583Ebo> fmts = helper.get8583Fields(new Integer(2));
//			for (TCfgFmt8583Ebo f : fmts) {
//				System.out.println(f.getPosition() + "," + f.getName());
//			}
			
			//测试从应用模块->报文->业务类型->业务种类
//			List<TC2MsgListEbo> msgs = helper.getBizMsg("HVPS");
//			for (TC2MsgListEbo msg : msgs) {
//				System.out.println(msg.getOutMsgCode());
//				List<TC2BisTpMsgEbo> tps = helper.getBizType(msg.getOutMsgCode());
//				for(TC2BisTpMsgEbo tp:tps){
//					System.out.println(tp.getTpName());
//					List<TC2BisClasEbo> clas = helper.getBizClas(msg.getOutMsgCode(),tp.getTpCode(),msg.getAppModule());
//					for(TC2BisClasEbo c:clas){
//						System.out.println(c.getClsCode());
//					}
//				}
//			}
			
			String msgCode = "hvps.111.001.01";
			String tpCode = "A100";
			String clsCode = "02116";
			TCfgFormatEbo fmtEbo = (TCfgFormatEbo)UIBizHelper.getInstance().get(TCfgFormatEbo.class, new Integer(2));
			
			List<TC2BisEleBscEbo> eles = UIBizHelper.getInstance().getBizFields(msgCode, tpCode, clsCode, "HVPS");
			List<TCfgFmt8583Ebo> fmts = UIBizHelper.getInstance().get8583Fields(fmtEbo.getOid());
			
			TCfgFmtEleMapFileEbo map = new TCfgFmtEleMapFileEbo();
			//map.setFormat(format)
			map.setTCfgFormat(fmtEbo);
			map.setMsgCode(msgCode);
			map.setTpCode(tpCode);
			map.setClsCode(clsCode);
			map.getMappings().add(UIBizHelper.getInstance().buildDetail(fmts.get(2), eles.get(3)));
			map.getMappings().add(UIBizHelper.getInstance().buildDetail(fmts.get(1), eles.get(2)));
			map.getMappings().add(UIBizHelper.getInstance().buildDetail(fmts.get(3), eles.get(4)));
			helper.saveMapRule(map, null);
			
			TCfgFmtEleMapFileEbo mapfile = helper.getMapRule(map.getTCfgFormat().getOid(),msgCode, tpCode, clsCode);
			System.out.println(mapfile.getMappings().size());
			// TCfgMapRuleEbo rule = helper.getRule(msgCode, tpCode, clsCode);
			// debug("rule id="+rule.getId());

			// TCfgMapRuleDetailEbo detail = new TCfgMapRuleDetailEbo();
			// detail.setBizFldEleId("biz1");
			// detail.setPteFldId(1);
			// rule.getMappings().add(detail);
			// detail.setRule(rule);
			// helper.saveRule(rule, null);

			// List<Integer> deletes = new ArrayList<Integer>();
			// deletes.add(rule.getMappings()(0).getId());
			// deletes.add(rule.getMappings().iterator().next().getId());
			// Iterator it = rule.getMappings().iterator();
			// it.next();
			// it.remove();

			// TCfgMapRuleDetailEbo detail2 = new TCfgMapRuleDetailEbo();
			// detail2.setBizFldEleId("bizzzzzzzzzz");
			// detail2.setPteFldId(3);
			// detail2.setRule(rule);
			// rule.getMappings().add(detail2);
			// helper.saveRule(rule, deletes);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}
